﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using System.Drawing;

namespace GestionEco
{
    public abstract class EtreVivant
	{

        protected string nomEtre;
        protected Image imageEtre;
        protected Texture2D texture;
        protected Coordonnee lesCoordDeEtreVivant;
        protected List<String> typeTerrain;
        protected int vieMax;
        protected int vieActuelle;
        protected int attaque;
        protected int esquive;
        protected int degats;
        protected int vue;
        protected int age;
        protected int majorite;
        protected int regen;
        protected int faimMax;
        protected int faimActuelle;
        protected int soifMax;
        protected int soifActuelle;
        protected int pointsActionActuels;
        //true -> male , false -> femelle
        protected bool sexe;



        public EtreVivant(bool s, int uneVieMax, int uneAttaque, int uneEsquive, int desDegats, int uneVue, int uneRegen, int uneFaimMax, int uneSoifMax, int desPointsActionActuels, string n, Image img, List<String> unTypeTerrain)
        {
            this.lesCoordDeEtreVivant = new Coordonnee();
            this.nomEtre = n;
            this.imageEtre = img;
            this.age = 0;
            this.typeTerrain = unTypeTerrain;
            this.vieMax = uneVieMax;
            this.attaque = uneAttaque;
            this.esquive = uneEsquive;
            this.degats = desDegats;
            this.vue = uneVue;
            this.regen = uneRegen;
            this.faimMax = uneFaimMax;
            this.soifMax = uneSoifMax;
            this.pointsActionActuels = desPointsActionActuels;
            this.sexe = s;
            this.vieActuelle = vieMax;
            this.faimActuelle = 0;
            this.soifActuelle = 0;
            
        }

        
        #region assesseurs

        public string NomEtre
        {
            get { return nomEtre; }
            set { nomEtre = value; }
        }

        public Image ImageEtre
        {
            get { return imageEtre; }
            set { imageEtre = value; }
        }

        public Texture2D Texture
        {
            get { return texture; }
            set { texture = value; }
        }

        public Coordonnee LesCoordDeEtreVivant
        {
            get { return lesCoordDeEtreVivant; }
            set { lesCoordDeEtreVivant = value; }
        }

        public List<String> TypeTerrain
        {
            get { return typeTerrain; }
            set { typeTerrain = value; }
        }

        public int VieMax
        {
            get { return vieMax; }
            set { vieMax = value; }
        }

        public int VieActuelle
        {
            get { return vieActuelle; }
            set { vieActuelle = value; }
        }

        public int Attaque
        {
            get { return attaque; }
            set { attaque = value; }
        }

        public int Degats
        {
            get { return degats; }
            set { degats = value; }
        }

        public int Majorite
        {
            get { return majorite; }
            set { majorite = value; }
        }

        public int Esquive
        {
            get { return esquive; }
            set { esquive = value; }
        }

        public int Vue
        {
            get { return vue; }
            set { vue = value; }
        }

        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        public int Regen
        {
            get { return regen; }
            set { regen = value; }
        }

        public int FaimActuelle
        {
            get { return faimActuelle; }
            set { faimActuelle = value; }
        }

        public int FaimMax
        {
            get { return faimMax; }
            set { faimMax = value; }
        }

        public int SoifMax
        {
            get { return soifMax; }
            set { soifMax = value; }
        }

        public int SoifActuelle
        {
            get { return soifActuelle; }
            set { soifActuelle = value; }
        }

        public int PointsActionActuels
        {
            get { return pointsActionActuels; }
            set { pointsActionActuels = value; }
        }

        public bool Sexe
        {
            get { return sexe; }
            set { sexe = value; }
        }
        #endregion

        //methode pour savoir si un etre vivant peut effectuer une action
        public virtual bool retraitPoints(int nb)
        {
            if (this.PointsActionActuels >= nb)
            {
                this.PointsActionActuels -= nb;
                return true;
            }
            else
            {
                return false;
            }
        }

        public virtual void seDeplacer()
        {

        }

        public virtual void seRegenerer()
        {

        }

        public virtual void vieillir()
        {
            // on ajoute 1 a l'age de l'animal
            this.Age += 1;
        }

        public virtual void boire(int quantite)
        {

                if (quantite >= this.soifActuelle)
                {
                    this.SoifActuelle = 0;
                }
                else
                {

                    this.soifActuelle -= quantite;
                }
            
        }

        public abstract EtreVivant seReproduire(EtreVivant e);
        public abstract void seNourrir(EtreVivant e);

        public String affichageConsole()
        {
            return (" nomEtre : " + nomEtre + " vieMax : " + vieMax.ToString() + " vieActuelle : " + vieActuelle.ToString() + " faimMax : " + faimMax.ToString() + " faimActuelle : " + faimActuelle.ToString() + " soifMax : " + soifMax.ToString() + " soifActuelle : " + soifActuelle.ToString());
        }
    }
}
